<!-- 输入内容校验 -->
<validator-input>

  <span>{message}</span>

  <script>
  //   for='检查目标1,检查目标2...'
  //   index='如果有同名的设置检测第几个，默认为0'
  //   rule='一些校验规则用, 分隔'
  //   reg='正则规则' flag='正则的flag'
  //   msg='如果不符合的报错信息'
  var tag = this;
  tag.fn = {
    focusFn: function(){
      tag.update({
        message: ''
      });
    },
    fetchValues: function(){
      tag.target = [];
      try{
        for(var i in opts.for.split(',')){
          tag.target[i] = tag.parent.refs[opts.for.split(',')[i]];
          if(tag.target[i] instanceof Array){
            tag.target[i] = tag.target[opts.index || 0];
          }
        }
        if(typeof tag.target[0] === 'undefined'){
          throw new Error();
        }
      }
      catch(e){
        return tag.update({
          message: '属性for所指定的校验对象没找到.'
        });
      }
      if(typeof tag.target[0] === 'undefined'){
        return tag.update({
          message: '属性for所指定的校验对象没找到.'
        });
      }

      if(!opts.rule && !opts.reg){
        return tag.update({
          message: '请指定校验规则，添加rule或reg属性.'
        });
      }

      for(var i in tag.target){
        if(tag.target[i] instanceof Array){
          tag.target[i].forEach(function(t){
            t.addEventListener('focus', tag.fn.focusFn, {once: true});
          });
        }
        else{
          tag.target[i].addEventListener('focus', tag.fn.focusFn, {once: true});
        }
      }
    }
  };

  this.on('mount', function(){});

  tag.on('check', function(){

    tag.invalid = false;
    tag.fn.fetchValues();
    if(!opts.rule) opts.rule = '';

    // 必填
    if(opts.rule.split(',').indexOf('required') !== -1){
      // console.log('check required');
      for(var i in tag.target){
        // console.log(tag.target[i].value);
        if(tag.target[i].value.replace(/\s/g, '') === '')
          tag.invalid = true;
      }
    }
    // 数字
    if(!tag.invalid && opts.rule.split(',').indexOf('number') !== -1){
      // console.log('check number');
      for(var i in tag.target){
        if(Number(tag.target[i].value) != tag.target[i].value)
          tag.invalid = true;
      }
    }
    // 正整数
    if(!tag.invalid && opts.rule.split(',').indexOf('+int') !== -1){
      // console.log('check +int');
      for(var i in tag.target){
        var v = parseInt(tag.target[i].value);
        if(v < 1 || !v || v!=tag.target[i].value)
          tag.invalid = true;
      }
    }
    // 正浮动
    if(!tag.invalid && opts.rule.split(',').indexOf('+float') !== -1){
      // console.log('check +float');
      for(var i in tag.target){
        var v = parseFloat(tag.target[i].value);
        if(!v){
          tag.invalid = true;
        }
        else if(String(v).split('.')[1] && String(v).split('.')[1].length > 2)
          tag.invalid = true;
        else if(v.toFixed(2) <= 0)
          tag.invalid = true;
      }
    }
    // 邮箱
    if(!tag.invalid && opts.rule.split(',').indexOf('email') !== -1){
      // console.log('email +int');
      for(var i in tag.target){
        if(/[^@]+@[^@]+\.[^@]+/.test(tag.target[i].value) === false)
          tag.invalid = true;
      }
    }
    // 正则
    if(!tag.invalid && opts.reg){
      var reg = new RegExp(opts.reg, opts.flag);
      for(var i in tag.target){
        // console.log(reg, target[i].value);
        tag.invalid = reg.test(tag.target[i].value) === false;
      }
    }
    if(tag.invalid){
      tag.emit('invalid', tag.target);
      tag.update({
        message: opts.msg
      });
    }
    else{
      tag.emit('valid', tag.target);
    }
  });

  tag.on('msg', function(msg){
    tag.update({
      message: msg
    });
  });
  </script>
</validator-input>
